/*
 * Copyright 2005-2013 finalist.cn. All rights reserved.
 * Support: http://www.finalist.cn
 * License: http://www.finalist.cn/license
 */
package com.finalist.dao;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.finalist.Filter;
import com.finalist.Page;
import com.finalist.Pageable;
import com.finalist.entity.Member;
import com.finalist.entity.Order;
import com.finalist.entity.Order.OrderStatus;
import com.finalist.entity.Order.PaymentStatus;
import com.finalist.entity.Order.ShippingStatus;

/**
 * Dao - 订单
 * 
 * @author Finalist IT Group
 * @version 3.0
 */
public interface OrderDao extends BaseDao<Order, Long>
{

    /**
     * 根据订单编号查找订单
     * 
     * @param sn
     *            订单编号(忽略大小写)
     * @return 订单，若不存在则返回null
     */
    Order findBySn(String sn);

    /**
     * 查找订单
     * 
     * @param member
     *            会员
     * @param count
     *            数量
     * @param filters
     *            筛选
     * @param orders
     *            排序
     * @return 订单
     */
    List<Order> findList(Member member, Integer count, List<Filter> filters, List<com.finalist.Order> orders);

    /**
     * 根据状态查找订单分页
     * 
     * @param member
     *            会员
     * @param pageable
     *            分页信息
     * @return 订单分页
     */
    Page<Order> findPage(Member member, PaymentStatus paymentStatus, Pageable pageable);

    /**
     * 根据订单状态查找订单分页
     * 
     * @param member
     *            会员
     * @param member
     *            状态  0-全部状态 1-等待付款 2-等待发货 3-等待收货 4-已完成订单 5-已取消
     * @param pageable
     *            分页信息
     * @return 订单分页
     */
    Page<Order> findPageByStatue(Member member, Integer statue, Pageable pageable);

    /**
     * 根据订单号查找订单分页
     * 
     * @param member
     *            会员
     * @param sn
     *            订单号
     * @param pageable
     *            分页信息
     * @return 订单分页
     */
    Page<Order> findPageByOrderSn(Member member, String sn, Pageable pageable);

    /**
     * 根据订单号查找订单分页
     * 
     * @param member
     *            会员
     * @param sn
     *            订单号
     * @param pageable
     *            分页信息
     * @return 订单分页
     */
    Page<Order> findPageByOrderName(Member member, String name, Pageable pageable);

    /**
     * 查找订单分页
     * 
     * @param member
     *            会员
     * @param pageable
     *            分页信息
     * @return 订单分页
     */
    Page<Order> findPage(Member member, Pageable pageable);

    /**
     * 查找订单分页
     * 
     * @param orderStatus
     *            订单状态
     * @param paymentStatus
     *            支付状态
     * @param shippingStatus
     *            配送状态
     * @param hasExpired
     *            是否已过期
     * @param pageable
     *            分页信息
     * @return 商品分页
     */
    Page<Order> findPage(OrderStatus orderStatus, String productName, PaymentStatus paymentStatus, ShippingStatus shippingStatus, Boolean hasExpired,Long adminId, Pageable pageable);

    /**
     * 查询订单数量
     * 
     * @param orderStatus
     *            订单状态
     * @param paymentStatus
     *            支付状态
     * @param shippingStatus
     *            配送状态
     * @param hasExpired
     *            是否已过期
     * @return 订单数量
     */
    Long count(OrderStatus orderStatus, PaymentStatus paymentStatus, ShippingStatus shippingStatus, Boolean hasExpired);

    /**
     * 查询等待支付订单
     * 
     * @param member
     *            会员
     * @return 等待支付订单数量
     */
    Page<Order> findPageBywaitingPayment(Member member, Pageable pageable);

    /**
     * 查询等待发货订单
     * 
     * @param member
     *            会员
     * @return 等待支付订单数量
     */
    Page<Order> findPageBywaitingShipping(Member member, Pageable pageable);

    /**
     * 查询等待支付订单数量
     * 
     * @param member
     *            会员
     * @return 等待支付订单数量
     */
    Long waitingPaymentCount(Member member);

    /**
     * 查询所有订单的数量
     * 
     * @param member
     *            会员
     * @return 所有订单的数量
     */
    Long allOrderCount(Member member);

    /**
     * 查询等待发货订单数量
     * 
     * @param member
     *            会员
     * @return 等待发货订单数量
     */
    Long waitingShippingCount(Member member);

    /**
     * 获取销售额
     * 
     * @param beginDate
     *            起始日期
     * @param endDate
     *            结束日期
     * @return 销售额
     */
    BigDecimal getSalesAmount(Date beginDate, Date endDate);

    /**
     * 获取销售量
     * 
     * @param beginDate
     *            起始日期
     * @param endDate
     *            结束日期
     * @return 销售量
     */
    Integer getSalesVolume(Date beginDate, Date endDate);

    /**
     * 释放过期订单库存
     */
    List<Order> releaseStock();

    /**
     * 根据支付状态查询订单信息
     * 
     * @param paymentStatus
     *            订单状态
     * @param isSelectedPhone
     *            是否有选择号码信息，true-有 false-查询所有订单（包括选号和未选号）
     * @return
     */
    List<Order> findByPaymentStatus(PaymentStatus paymentStatus, boolean isSelectedPhone);

    /**
     * 根据订单号查找订单分页
     * 
     * @param member
     *            会员
     * @param sn
     *            订单号列表
     * @param pageable
     *            分页信息
     * @return 订单分页
     */
    Page<Order> findPageByOrderSnList(Member member, List<String> snList, Pageable pageable);

    /**
     * 查询会员消费金额（订单支付状态为已经支付或在部分支付、部分退款及且订单状态为未取消的订单）
     * 
     * 当member为null时，则查询所有（订单支付状态为已经支付或在部分支付、部分退款及且订单状态为未取消的订单）订单的金额
     * 
     * @param member
     *            会员
     * @return  消费金额
     */
    BigDecimal getTotalConsume(Member member);

    /**
     * 查询等待收货订单数量
     * 
     * @param member
     *            会员
     * @return 等待收货订单数量
     */
    Long waitingReceiveOrderCount(Member member);

    /**
     * 查询已完成订单数量
     * 
     * @param member
     *            会员
     * @return 等待已完成订单数量
     */
    Long finishOrderCount(Member member);

    /**
     * 查询已取消订单数量（不包括包过括过期订单）
     * 
     * @param member
     *            会员
     * @return 等待发货订单数量
     */
    Long cancelOrderCount(Member member);
    
    /**
     * 查询已过期订单数量
     * 
     * @param member
     *            会员
     * @return 等待发货订单数量
     */
    Long expiredOrderCount(Member member);
    
    List<Order> findPage(Member member, Integer status);
    
    void updateOrderNopaid();
    
}